//package art.yulang.server;
//
//import art.yulang.pojo.Request;
//import art.yulang.pojo.RequestProcessor;
//import art.yulang.pojo.Response;
//import art.yulang.servlet.HttpServlet;
//import art.yulang.utils.HttpProtocolUtil;
//import org.dom4j.Document;
//import org.dom4j.DocumentException;
//import org.dom4j.Element;
//import org.dom4j.Node;
//import org.dom4j.io.SAXReader;
//
//import java.io.IOException;
//import java.io.InputStream;
//import java.io.OutputStream;
//import java.net.ServerSocket;
//import java.net.Socket;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.*;
//
///**
// * 自定义minicat启动类
// */
//public class Bootstrap {
//    /**自定义监听端口*/
//    private Integer port = 8080;
//
//    private Map<String, HttpServlet> servletMap = new HashMap<>();
//
//    int corePoolSize = 5;
//    int maximumPoolSize = 50;
//    long keepAliveTime = 100;
//    TimeUnit unit = TimeUnit.SECONDS;
//    BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(50);
//    ThreadFactory threadFactory = Executors.defaultThreadFactory();
//    RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
//    private ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
//
//    public void start() throws Exception {
//        /**
//         * 加载解析相关配置，web.xml
//         * 3.0版本起使用
//         */
//        loadServlet();
//
//        /**
//         * minicat1.0版本
//         * 需求：浏览器访问：localhost:8080，返回固定字符串 Hello minicat! 到浏览器
//         */
//        ServerSocket serverSocket = new ServerSocket(port);
//        System.out.println("### minicat start on 8080........");
//        /*String data = "Hello minicat!";
//        while(true){
//            Socket socket = serverSocket.accept();
//            //有了socket，接收到请求，获取输出流
//            OutputStream outputStream = socket.getOutputStream();
//            outputStream.write((HttpProtocolUtil.getHeader200((long) data.getBytes().length) + data).getBytes());
//            socket.close();
//        }*/
//
//        /**
//         * minicat2.0版本
//         * 需求：分装request和response对象，返回html静态页面
//         */
//        /*while (true){
//            Socket socket = serverSocket.accept();
//            InputStream inputStream = socket.getInputStream();
//
//            Request request = new Request(inputStream);
//            Response response = new Response(socket.getOutputStream());
//            response.outputHtml(request.getUrl());
//
//            socket.close();
//        }*/
//
//        /**
//         * minicat3.0版本
//         * 需求：可以请求动态资源（servlet）
//         */
//        /*while (true){
//            Socket socket = serverSocket.accept();
//            InputStream inputStream = socket.getInputStream();
//
//            Request request = new Request(inputStream);
//            Response response = new Response(socket.getOutputStream());
//            if(servletMap.get(request.getUrl()) == null){//静态资源处理
//                response.outputHtml(request.getUrl());
//            }else{
//                HttpServlet httpServlet = servletMap.get(request.getUrl());
//                httpServlet.service(request, response);
//            }
//
//            socket.close();
//        }*/
//
//        /**
//         * 3.0 基础上不使用线程池多线程改造
//         */
//        /*while (true){
//            Socket socket = serverSocket.accept();
//            RequestProcessor processor = new RequestProcessor(socket, servletMap);
//            processor.start();
//        }*/
//
//        /**
//         * 3.0 基础上使用线程池 多线程改造
//         */
//        while (true){
//            Socket socket = serverSocket.accept();
//            RequestProcessor processor = new RequestProcessor(socket, servletMap);
//            threadPoolExecutor.execute(processor);
//        }
//    }
//
//    private void loadServlet() {
//        InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("web.xml");
//        SAXReader reader = new SAXReader();
//        try {
//            Document document= reader.read(resourceAsStream);
//            Element rootElement = document.getRootElement();
//            List<Element> list = rootElement.selectNodes("//servlet");
//            for (Element element : list) {
//                // <servlet-name>myServlet</servlet-name>
//                Element servletNameElement = (Element) element.selectSingleNode("servlet-name");
//                String servletName = servletNameElement.getStringValue();
//                // <servlet-class>art.yulang.servlet.MyServlet</servlet-class>
//                Element servletClassElement = (Element) element.selectSingleNode("servlet-class");
//                String servletClass = servletClassElement.getStringValue();
//
//                //根据servlet-name的值找到url-pattern
//                Element servletMapping = (Element) rootElement.selectSingleNode("/web-app/servlet-mapping[servlet-name='" + servletName + "']");
//                // <url-pattern>/myServlet</url-pattern>
//                Element urlPatternElement = (Element) servletMapping.selectSingleNode("url-pattern");
//                String urlPattern = urlPatternElement.getStringValue();
//
//                servletMap.put(urlPattern, (HttpServlet) Class.forName(servletClass).newInstance());
//            }
//        }catch (Exception ex){
//            ex.printStackTrace();
//        }
//    }
//
//    public static void main(String[] args) {
//        Bootstrap bootstrap = new Bootstrap();
//        try {
//            bootstrap.start();
//        } catch (IOException e) {
//            e.printStackTrace();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    public Integer getPort() {
//        return port;
//    }
//
//    public void setPort(Integer port) {
//        this.port = port;
//    }
//}
